import wx from 'weixin-js-sdk'
import {
  getWechatApiConfig,
  getWechatOpenid
} from '@api/modules/index'
import {
  setStorageOpenid,
  getStorageOpenid
} from '@utils/storage_base_config';
import {
  DEF_SHARE_INFO,
  WX_APPID,
} from '@utils/default_config'

const IS_DEBUG = false

const JS_API_LIST = [
  'updateAppMessageShareData', // 分享给朋友、QQ
  'updateTimelineShareData', // 分享到朋友圈、QQ空间
  'chooseImage',
  'hideAllNonBaseMenuItem',
  'showAllNonBaseMenuItem',
  'chooseWXPay',
  'openLocation'
]

const DEF_SHARE = Object.assign(DEF_SHARE_INFO, {
  success: function() {}
})

/**
 * 微信分享配置
 * @param shareParams 分享配置
 * @param canShare true:显示分享菜单 false:禁用
 */
function init(shareParams, canShare) {
  const url = window.location.href.split('#')[0] // 当前链接域名
  getWechatApiConfig({
    url,
    apis: JS_API_LIST,
    debug: IS_DEBUG,
  }).then(res => {
    wx.config({
      ...res.data,
      debug: IS_DEBUG, // 开启调试模式,调用的所有api的返回值会在客户端console.log出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
    })

    // 处理验证成功的信息
    wx.ready(function() {
      // 隐藏所有非基础按钮接口
      if (canShare === false) {
        wx.hideAllNonBaseMenuItem()
        return
      }
      wx.showAllNonBaseMenuItem()
    })

    // 处理验证失败的信息
    wx.error(function(res) {
      console.error('微信验证失败:', res)
    })
  }).catch(err => {})

  share(shareParams)
}

/**
 * 分享
 */
function share(shareParams) {
  wx.ready(function() {
    shareParams || (shareParams = {})
    const params = {
      link: shareParams.link || window.location.href, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
      title: shareParams.title || DEF_SHARE.title || document.title,
      imgUrl: shareParams.imgUrl || DEF_SHARE.imgUrl,
      desc: shareParams.desc || DEF_SHARE.desc,
      success: DEF_SHARE.success
    }

    // 分享给朋友、QQ
    wx.updateAppMessageShareData(params)
    // 分享到朋友圈、QQ空间
    // NOTE: 不需要 desc 参数
    wx.updateTimelineShareData(params)
  })
}

/**
 * 上传图片
 */
function chooseImage() {
  wx.ready(function() {
    wx.chooseImage({
      count: 1, // 默认9
      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图，默认二者都有
      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机，默认二者都有
      success: function(res) {
        // let localIds = res.localIds // 返回选定照片的本地ID列表，localId可以作为img标签的src属性显示图片
        wx.getLocalImgData({
          localId: res.localIds[0], // 图片的localID
          success: function(res) {
            // localData是图片的base64数据，可以用img标签显示
            // store.dispatch('setLocalId', res.localData)
          }
        })
      }
    })
  })
}

/**
 * 支付
 */
function pay(params) {
  wx.ready(function() {
    wx.chooseWXPay({
      timestamp: params.timeStamp, // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
      nonceStr: params.nonceStr, // 支付签名随机串，不长于 32 位
      package: params.packageValue, // 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=\*\*\*）
      signType: params.signType, // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
      paySign: params.paySign, // 支付签名
      outTradeNo: params.outTradeNo, // 商户订单号
      success: function(res) {
        // 支付成功后的回调函数
        console.info(res)
        if (res.errMsg === 'chooseWXPay:ok') {
          // 使用以上方式判断前端返回,微信团队郑重提示    ：
          // res.err_msg将在用户支付成功后返回ok，但并不保证它绝对可靠。
          // app.$store.dispatch('updateStatus', true)
          console.info('支付成功')
        } else {
          app.$store.dispatch('updateStatus', false)
          console.info('支付失败')
        }
      },
      // 支付取消回调函数
      cancel: function(res) {
        app.$store.dispatch('updateStatus', false)
        console.info('取消支付')
      },
      // 支付失败回调函数
      fail: function(res) {
        app.$store.dispatch('updateStatus', false)
        console.info('支付失败')
      }
    })
  })
}

/**
 * 地图
 * @param 纬度
 * @param 经度
 */
function map(params) {
  wx.ready(function() {
    wx.openLocation({
      latitude: params.latitude || 0, // 纬度，浮点数，范围为90 ~ -90
      longitude: params.longitude || 0, // 经度，浮点数，范围为180 ~ -180
      name: _trim(params.name), // 位置名
      address: _trim(params.address), // 地址详情说明
      scale: params.scale || 14, // 地图缩放级别,整形值,范围从1~28。默认为最大
      infoUrl: _trim(params.infoUrl) // 在查看位置界面底部显示的超链接,可点击跳转
    })
  })
}

function getOpenid(code) {
  return getWechatOpenid(code)
}

function getCode(redirectUri) {
  redirectUri = encodeURIComponent(redirectUri || location.href)
  const STATE = 'STATE'
  const SCOPE = 'snsapi_userinfo' // 拉取用户信息
  window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${WX_APPID}&redirect_uri=${redirectUri}&response_type=code&scope=${SCOPE}&state=${STATE}#wechat_redirect`
}


function _trim(str) {
  return typeof str === 'string' ? str.trim() : str
}

export default {
  init,
  chooseImage,
  pay,
  map,
  share,
  getOpenid,
  getCode,
}